﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CES_Application.Models;
using CES_Application.Models.Negocio;
using CES_Application.Helpers;
using BarcodeLib;
using DevComponents.DotNetBar;

namespace CES_Application.Telas
{
    public partial class Tela_Produto : Office2007Form

    {
        NegocioProduto negocioProduto;
        NegocioFornecedor negocioFornecedor;
        Boolean isalteracao;
        Produto produto;
        

        FormPrincipal fp;
        public Tela_Produto()
        {
            negocioProduto = new NegocioProduto();
            negocioFornecedor = new NegocioFornecedor();
            InitializeComponent();
        }

        public Tela_Produto(FormPrincipal fp)
        {
            this.fp = fp;
            negocioProduto = new NegocioProduto();
            negocioFornecedor = new NegocioFornecedor();
            InitializeComponent();
        }

        private void Tela_Produto_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.fp.IsMdiContainer = false;
        }


        private void Tela_Produto_Load(object sender, EventArgs e)
        {

            DesabilitarCampos();
            //RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(this, DevComponents.DotNetBar.Rendering.eOffice2007ColorScheme.VistaGlass);
            loadProdutos();
            
            //gvwListaProduto.DataSource = negocioProduto.ObterTodossql(); 
            cbxClassificacao.DataSource = negocioProduto.classificacaoProdutos();
            cbxUnidade.DataSource = negocioProduto.unidadeProdutos();

            #region CarregarComboboxFornecedor
            cbxFornecedor.DataSource = negocioFornecedor.ObterTodos();
            cbxFornecedor.DisplayMember = "descricao";
            cbxFornecedor.ValueMember = "idFornecedor";
            #endregion

            #region CarregarComboboxTipoProduto
            cbxTipoProduto.DataSource = negocioProduto.obterTodosTiposProd();
            cbxTipoProduto.DisplayMember = "descricao";
            cbxTipoProduto.ValueMember = "idTipo";
            #endregion

            gbxEdicao.Visible = false;
            pnlInsercao.Visible = true;
        }

        private void loadProdutos()
        {
            gvwListaProduto.AutoGenerateColumns = false;
            gvwListaProduto.Font = new Font("Arial Rounded MT", 8, FontStyle.Bold);
            gvwListaProduto.DataSource = negocioProduto.ObterTodos();
        }

        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            if (tabControl1.SelectedTab == tpgCadastro)
            {
                gbxEdicao.Visible = false;
                pnlInsercao.Visible = true;
                //gvwListaProduto.DataSource = negocioProduto.ObterTodos();

            }
            else
            {
                if (tabControl1.SelectedTab == tpgPesq)
                {
                    gbxEdicao.Visible = true;
                    pnlInsercao.Visible = false;
                    //gvwListaProduto.DataSource = negocioProduto.ObterTodos();

                }
            }
        }


        private void limpaCampos()
        {
            tbxCodigo.Text = "<AUTO>";
            tbxDesc.Clear();
            tbxFabricante.Clear();
            tbxMetrica.Clear();
            tbxPercentual.Clear();
            tbxQtd.Clear();
            tbxTotal.Clear();
            tbxValorCompra.Clear();
            tbxValorVenda.Clear();
            lblMsg.Text = "";
        }

        

        private void btnNovo_Click(object sender, EventArgs e)
        {

            tbxCodBarras.Text = Convert.ToString(negocioProduto.ObterUltimoID() + 10000);
            HabilitarCampos();
            limpaCampos();
        }



        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        private Produto addDadosProduto()
        {
            if (!isalteracao)
            {
                produto = new Produto();
                produto.dataEntrada = DateTime.Now;
                produto.usuarioEntrada = "";
                produto.dataAlteracao = DateTime.Now;
                produto.usuarioAlteracao = "";
                produto.quantidadeEstoque = produto.quantidade;
                produto.isEstoque = true;

            }
            else
            {
                produto.idProduto = Convert.ToInt32(lblcodigo.Text);
                produto.dataAlteracao = DateTime.Now;
                produto.usuarioAlteracao = "";

            }
            
            produto.descricao = tbxDesc.Text;
            produto.TipoProduto_idTipo = Convert.ToInt32(cbxTipoProduto.SelectedValue);
            produto.classificacao = cbxClassificacao.SelectedValue.ToString();
            produto.Fornecedor_idFornecedor = Convert.ToInt32(cbxFornecedor.SelectedValue);
            produto.fabricante = tbxFabricante.Text;
            produto.unidade = cbxUnidade.SelectedValue.ToString();
            produto.metrica = Convert.ToInt32(tbxMetrica.Text);
            produto.valorCompra = Convert.ToDecimal(tbxValorCompra.Text);
            produto.valorVenda = Convert.ToDecimal(tbxValorVenda.Text);
            produto.percetualLucro = Convert.ToInt32(tbxPercentual.Text);
            produto.quantidade = Convert.ToInt32(tbxQtd.Text);
            produto.valorTotal = Convert.ToDecimal(tbxTotal.Text);
            produto.codBarras = tbxCodBarras.Text;
            
            

            return produto;
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (ValidaCampos())
            {
                if (!isalteracao)
                {
                    negocioProduto.Inserir(addDadosProduto());
                    tbxCodigo.Text = Convert.ToString(produto.idProduto);
                    DesabilitarCampos();
                    lblMsg.Text = "PRODUTO CADASTRADO!";
                    isalteracao = false;
                    loadProdutos();
                }
                else
                {
                    negocioProduto.Editar(addDadosProduto());
                    lblMsg.Text = "PRODUTO ALTERADO!";
                    DesabilitarCampos();
                    isalteracao = false;
                    loadProdutos();

                }
            }
            else 
            {
                lblMsg.Text = " CAMPOS OBRIGÁTORIOS INVÁLIDOS!";
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            limpaCampos();
            DesabilitarCampos();
            tbxCodBarras.Clear();
            pbxCodBarras.Image = null;
            
        }

        private void btnPesqProduto_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedTab = tpgPesq;
        }

        private void btnAlterar_Click(object sender, EventArgs e)
        {
            isalteracao = true;
            produto = new Produto();
            produto = negocioProduto.Obter(Convert.ToInt32(lblcodigo.Text));
            CarregaCampos(produto);
            tabControl1.SelectedTab = tpgCadastro;
            HabilitarCampos();
            btnAlterar.Enabled = false;
            
        }


        /// <summary>
        /// Preencher os campos do formulario com os dados da entidade passada
        /// </summary>
        /// <param name="produto"></param>
        private void CarregaCampos(Produto produto)
        {

            tbxDesc.Text =produto.descricao ;
            cbxTipoProduto.SelectedValue = produto.TipoProduto_idTipo;
            cbxClassificacao.SelectedItem = produto.classificacao;
            cbxFornecedor.SelectedValue = produto.Fornecedor_idFornecedor;
            tbxFabricante.Text = produto.fabricante;
            cbxUnidade.SelectedItem = produto.unidade.ToString();
            tbxMetrica.Text = Convert.ToString(produto.metrica);
            tbxValorCompra.Text = Convert.ToString(produto.valorCompra);
            tbxValorVenda.Text = Convert.ToString(produto.valorVenda);
            tbxPercentual.Text = Convert.ToString(produto.percetualLucro);
            tbxQtd.Text = Convert.ToString(produto.quantidade);
            tbxTotal.Text = Convert.ToString(produto.valorTotal);
            tbxCodBarras.Text = produto.codBarras;
 
        }

        private bool ValidaCampos()
        {
            if (tbxValorCompra.Text == "" || tbxValorVenda.Text == "" || tbxPercentual.Text == "" || tbxTotal.Text == "" || tbxTotal.Text == "")
                return false;
            else
            {
                if (tbxFabricante.Text == "" || tbxMetrica.Text == "")
                    return false;
                else
                    return true;
            }
        }


        /// <summary>
        /// Cancelar do Tab Pesquisa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {

        }


        private void DesabilitarCampos()
        {
            tbxDesc.Enabled = false;
            cbxTipoProduto.Enabled = false;
            cbxClassificacao.Enabled = false;
            cbxFornecedor.Enabled = false;
            tbxFabricante.Enabled = false;
            cbxUnidade.Enabled = false;
            tbxMetrica.Enabled = false;
            tbxValorCompra.Enabled = false;
            tbxValorVenda.Enabled = false;
            tbxPercentual.Enabled = false;
            tbxQtd.Enabled = false;
            tbxTotal.Enabled = false;
            btnSalvar.Enabled = false;
            btnNovo.Enabled = true;
        }

        private void HabilitarCampos()
        {

            tbxDesc.Enabled = true;
            cbxTipoProduto.Enabled = true;
            cbxClassificacao.Enabled = true;
            cbxFornecedor.Enabled = true;
            tbxFabricante.Enabled = true;
            cbxUnidade.Enabled = true;
            tbxMetrica.Enabled = true;
            tbxValorCompra.Enabled = true;
            tbxValorVenda.Enabled = true;
            tbxPercentual.Enabled = true;
            tbxQtd.Enabled = true;
            tbxTotal.Enabled = true;
            btnSalvar.Enabled = true;
            btnNovo.Enabled = false;
        }


        private void GerarCodBarras(String codigo)
        {
            Barcode b = new Barcode();
            b.IncludeLabel = true;
            pbxCodBarras.Image = b.Encode(TYPE.CODE128,
           codigo, Color.Black, Color.White, 252, 77);


            pbxCodBarras.Width = pbxCodBarras.Image.Width;
            pbxCodBarras.Height = pbxCodBarras.Image.Height;
        }

        private void tbxCodBarras_TextChanged(object sender, EventArgs e)
        {
            if(tbxCodBarras.Text !="")
              GerarCodBarras(tbxCodBarras.Text);
        }

        private void btnPesq_Click(object sender, EventArgs e)
        {
            int id =0;
            if(tbxCodP.Text !="")
              id = Convert.ToInt32(tbxCodP.Text);
             gvwListaProduto.DataSource = negocioProduto.ObterProdutos(tbxDescP.Text,tbxCodBarrasP.Text,id);
        }


        
        private void gvwListaProduto_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            string propName = gvwListaProduto.Columns[e.ColumnIndex].DataPropertyName;
            object propVal = gvwListaProduto.Rows[e.RowIndex].DataBoundItem;


            if (propName.Contains('.') && propVal != null)
            {
                while (propName.Contains('.') && propVal != null)
                {
                    propVal = propVal.GetType().GetProperty(propName.Substring(0, propName.IndexOf('.'))).GetValue(propVal, null);
                    propName = propName.Substring(propName.IndexOf('.') + 1);
                }
                if (propVal != null)
                {
                    e.Value = propVal.GetType().GetProperty(propName).GetValue(propVal, null);
                }
            }
        }

        private void tbxDescP_TextChanged(object sender, EventArgs e)
        {
            gvwListaProduto.DataSource = negocioProduto.ObterProdutos(tbxDescP.Text, tbxCodBarrasP.Text, 0);
        }

        private void tbxMetrica_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', '.', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxValorCompra_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxValorVenda_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxPercentual_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxQtd_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }

        private void tbxTotal_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            {
                char[] trim = { '=', '\\', ';', ':', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm'
                                  , 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'z', 'k', 'w', 'y', 'A'
                                  , 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'O', 'P', 'Q',
                                  'R', 'S', 'T', 'U', 'V', 'X', 'Z', 'K', 'Y', 'W', '+' , '*' };
                int pos;
                while ((pos = tbx.Text.IndexOfAny(trim)) >= 0)
                {
                    tbx.Text = tbx.Text.Remove(pos, 1);
                    tbx.SelectionStart = tbx.Text.Count();
                }
            }
        }


        private void gvwListaProduto_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int linhaAtual = Convert.ToInt32(e.RowIndex.ToString());
            if ((e.RowIndex == -1) || (e.ColumnIndex == -1))
                return;              
            else
            {
                lblcodigo.Text = gvwListaProduto.CurrentRow.Cells["idProduto"].Value.ToString();
                btnAlterar.Enabled = true;

            }
        }

        private void tbxValorCompra_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxValorVenda_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }

        private void tbxTotal_Leave(object sender, EventArgs e)
        {
            HelprsClass.NumeroCom2CasasDecimais((TextBox)sender);
        }
       


    }
}
